index.tsx 3.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. import { LOCAL_STORAGE_KEYS, useParams } from 'common'
  2. import { useState } from 'react'
  3. import { PageContainer } from 'ui-patterns/PageContainer'
  4. import { PageSection, PageSectionContent } from 'ui-patterns/PageSection'
  5. import { TableList } from '@/components/interfaces/Database/Tables/TableList'
  6. import DeleteConfirmationDialogs from '@/components/interfaces/TableGridEditor/DeleteConfirmationDialogs'
  7. import { SidePanelEditor } from '@/components/interfaces/TableGridEditor/SidePanelEditor/SidePanelEditor'
  8. import DatabaseLayout from '@/components/layouts/DatabaseLayout/DatabaseLayout'
  9. import DefaultLayout from '@/components/layouts/DefaultLayout'
  10. import { PageLayout } from '@/components/layouts/PageLayout/PageLayout'
  11. import { AutoEnableRLSNotice } from '@/components/ui/AutoEnableRLSNotice'
  12. import { Entity, isTableLike, postgresTableToEntity } from '@/data/table-editor/table-editor-types'
  13. import { useLocalStorageQuery } from '@/hooks/misc/useLocalStorage'
  14. import { useTableEditorStateSnapshot } from '@/state/table-editor'
  15. import { TableEditorTableStateContextProvider } from '@/state/table-editor-table'
  16. import type { NextPageWithLayout } from '@/types'
  17. const DatabaseTables: NextPageWithLayout = () => {
  18. const { ref: projectRef } = useParams()
  19. const snap = useTableEditorStateSnapshot()
  20. const [selectedTableToEdit, setSelectedTableToEdit] = useState<Entity>()
  21. const [isAutoEnableRLSMinimized] = useLocalStorageQuery(
  22. LOCAL_STORAGE_KEYS.RLS_EVENT_TRIGGER_BANNER_DISMISSED(projectRef ?? ''),
  23. false
  24. )
  25. return (
  26. <>
  27. <PageLayout
  28. title="Database Tables"
  29. size="large"
  30. primaryActions={isAutoEnableRLSMinimized && <AutoEnableRLSNotice iconOnly />}
  31. >
  32. <PageContainer size="large">
  33. <PageSection>
  34. {!isAutoEnableRLSMinimized && <AutoEnableRLSNotice />}
  35. <PageSectionContent>
  36. <TableList
  37. onAddTable={snap.onAddTable}
  38. onEditTable={(table) => {
  39. setSelectedTableToEdit(postgresTableToEntity(table))
  40. snap.onEditTable()
  41. }}
  42. onDeleteTable={(table) => {
  43. setSelectedTableToEdit(postgresTableToEntity(table))
  44. snap.onDeleteTable()
  45. }}
  46. onDuplicateTable={(table) => {
  47. setSelectedTableToEdit(postgresTableToEntity(table))
  48. snap.onDuplicateTable()
  49. }}
  50. />
  51. </PageSectionContent>
  52. </PageSection>
  53. </PageContainer>
  54. </PageLayout>
  55. {projectRef !== undefined &&
  56. selectedTableToEdit !== undefined &&
  57. isTableLike(selectedTableToEdit) && (
  58. <TableEditorTableStateContextProvider
  59. key={`table-editor-table-${selectedTableToEdit.id}`}
  60. projectRef={projectRef}
  61. table={selectedTableToEdit}
  62. >
  63. <DeleteConfirmationDialogs selectedTable={selectedTableToEdit} />
  64. </TableEditorTableStateContextProvider>
  65. )}
  66. <SidePanelEditor
  67. includeColumns
  68. selectedTable={
  69. selectedTableToEdit !== undefined && isTableLike(selectedTableToEdit)
  70. ? selectedTableToEdit
  71. : undefined
  72. }
  73. />
  74. </>
  75. )
  76. }
  77. DatabaseTables.getLayout = (page) => (
  78. <DefaultLayout>
  79. <DatabaseLayout title="Tables">{page}</DatabaseLayout>
  80. </DefaultLayout>
  81. )
  82. export default DatabaseTables